package material.iteratorAndComponent.iteratorAndComponent;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 菜单和菜单项一样，都是MenuComponent
 */
public class Menu extends MenuComponent {
    /**
     * 菜单可以有任意数目的孩子，这些孩子都必须属于MenuComponent类型
     * 我们使用内部的ArrayList记录它们
     */
    ArrayList menuComponents = new ArrayList();
    String name;
    String description;

    public Iterator createIterator() {
        return new CompositeIterator(menuComponents.iterator());
    }

    /**
     * 这个和我们之前的实现不一样，我们将给每个菜单一个名字和一个描述
     * 每个菜单的类名称就是此菜单的名字
     *
     * @param name
     * @param description
     */
    public Menu(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public void add(MenuComponent menuComponent) {
        menuComponents.add(menuComponent);
    }

    public void remove(MenuComponent menuComponent) {
        menuComponents.remove(menuComponent);
    }

    public MenuComponent getChild(int i) {
        return (MenuComponent) menuComponents.get(i);
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public String getDescription() {
        return description;
    }

    public void print() {
        System.out.print("\n" + getName());
        System.out.println(", " + getDescription());
        System.out.println("----------------------");
        /**
         * 我们用了迭代器，用它来遍历所有菜单组件。。。
         * 在遍历过程中，可能会遇到其他菜单或者某个菜单项。
         * 由于菜单和菜单项都实现print()，那我们只要调用print()即可
         */
        Iterator iterator = menuComponents.iterator();
        while (iterator.hasNext()) {
            MenuComponent menuComponent = (MenuComponent) iterator.next();
            menuComponent.print();
        }
    }
}
